package gui;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

import db.GestionBBDD;

import java.awt.*;
import java.awt.event.*;
import java.sql.Blob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
/**
 * Gestiona el panel principal de la aplicación. Inicializa todas las variables a partir de la base de datos,
 * y distribuye los elementos en el JFrame.
 * @author Javier
 * 
 */
public class MainWindow extends JFrame {

	// Atributos de la clase
	private static final long serialVersionUID = -1314009763748015765L;
	ArrayList<Deportiva> dVans = new ArrayList<Deportiva>(),
			dNike = new ArrayList<Deportiva>(),
			dNb = new ArrayList<Deportiva>();
	ArrayList<Deportiva> dAsics = new ArrayList<Deportiva>(),
			mi_cesta = new ArrayList<Deportiva>(), 
			dOtras=new ArrayList<Deportiva>();
	GraphicsDevice grafica = GraphicsEnvironment.getLocalGraphicsEnvironment()
			.getDefaultScreenDevice();

	String username;
	PanelMarca vans, nike, nb, asics, otras;
	PanelInicio inicio;
	JPanel izq, centro;
	PanelNorte norte;
	PanelSur sur;
	PanelDescripcion desc;
	PanelCesta cesta;
	ArrayList<Deportiva> deportivas = new ArrayList<Deportiva>(),
			buscadas = new ArrayList<Deportiva>();
	ResultSet zapas;

	int num_articulos = 0;
	public static JFrame frameInsertar;
	public static JFrame frameEliminar;
	public static JFrame frameComprar;
	
	/**
	 * Constructor del objeto MainWindow
	 */
	public MainWindow() { }

	/**
	 * Inicializa los vectores con las deportivas a partir de la base
	 * de datos
	 * @throws SQLException En el caso de porducirse un error en la base de datos
	 */
	public void start() throws SQLException {

		zapas = GestionBBDD.listaZap();
		dVans = new ArrayList<Deportiva>();
		dNb = new ArrayList<Deportiva>();
		dNike = new ArrayList<Deportiva>();
		dAsics = new ArrayList<Deportiva>();
		dOtras=new ArrayList<Deportiva>();
		deportivas = new ArrayList<Deportiva>();
		while (zapas.next()) {
			int id = zapas.getInt("id");
			String marca = zapas.getString("marca");
			String modelo = zapas.getString("modelo");
			String color = zapas.getString("color");
			float precio = zapas.getFloat("precio");
			String descripcion = zapas.getString("descripcion");
			Blob imagen = zapas.getBlob("imagen");
			Deportiva dep = new Deportiva(id, precio, marca, modelo,
					descripcion, color, imagen);
			if (marca.toUpperCase().equals("VANS")) {
				dVans.add(dep);
			} else if (marca.toUpperCase().equals("NIKE")) {
				dNike.add(dep);
			} else if (marca.toUpperCase().equals("ASICS")) {
				dAsics.add(dep);
			} else if (marca.toUpperCase().equals("NEW BALANCE")) {
				dNb.add(dep);
			}
			else{
				dOtras.add(dep);
			}
			deportivas.add(dep);
		}

		distribute();
	}

	/**
	 * Distribuye todos los paneles en el MainWindow.
	 * @throws SQLException En el caso de haber error relacionado con la base de datos
	 */
	private void distribute() throws SQLException {
		// this.setMinimumSize(new Dimension(1270,750));
		// grafica.setFullScreenWindow(this);
		this.setExtendedState(JFrame.MAXIMIZED_BOTH);
		this.setVisible(true);
		norte = new PanelNorte(num_articulos);
		this.add(norte, BorderLayout.NORTH);

		centro = new JPanel();
		inicio = new PanelInicio();
		centro.add(inicio);
		this.add(centro, BorderLayout.CENTER);

		sur = new PanelSur();
		this.add(sur, BorderLayout.SOUTH);
		this.revalidate();

		vans = new PanelMarca(dVans);
		nike = new PanelMarca(dNike);
		nb = new PanelMarca(dNb);
		asics = new PanelMarca(dAsics);
		otras = new PanelMarca(dOtras);
		cesta = new PanelCesta(mi_cesta);

		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);

		norte.getMenu().getAdidas().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				eliminarCentro();
				centro = new JPanel();
				// adidas = new PanelMarca(dAdidas);
				updateMarca(centro, vans);

			}
		});
		norte.getMenu().getNike().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				eliminarCentro();
				centro = new JPanel();
				// nike = new PanelMarca(dNike);
				updateMarca(centro, nike);
			}
		});
		norte.getMenu().getNb().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {

				eliminarCentro();
				centro = new JPanel();
				// nb = new PanelMarca(dNb);
				updateMarca(centro, nb);
			}
		});
		norte.getMenu().getAsics().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				eliminarCentro();
				centro = new JPanel();
				// asics = new PanelMarca(dAsics);
				updateMarca(centro, asics);
			}
		});
		norte.getMenu().getOtras().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				eliminarCentro();
				centro = new JPanel();
				// asics = new PanelMarca(dAsics);
				updateMarca(centro, otras);
			}
		});
		norte.getMenu().getInicio().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				eliminarCentro();
				centro = new JPanel();
				updateInicio(centro, inicio);
				try {
					start();
				} catch (SQLException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});
		norte.getBc().getCesta().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				eliminarCentro();
				
				centro = new JPanel();
				cesta = new PanelCesta(mi_cesta);

				updateMiCesta(centro, cesta);

			}
		});
		norte.getBc().getBotonInsertar().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				InsertarDeportiva idep = new InsertarDeportiva();
				frameInsertar = new JFrame();
				frameInsertar.setTitle("Insertar zapatilla");
				frameInsertar.add(idep);
				frameInsertar.pack();
				frameInsertar.setVisible(true);
				frameInsertar.revalidate();

			}
		});

		norte.getBc().getBotonEliminar().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				EliminarZapatilla elim = new EliminarZapatilla(vans, nb, nike,
						asics, otras);
				frameEliminar = new JFrame();
				frameEliminar.setTitle("Eliminar zapatilla");
				frameEliminar.add(elim);
				frameEliminar.pack();
				frameEliminar.setVisible(true);
				frameEliminar.revalidate();

			}
		});
		
		norte.getBc().getBotonVaciar().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				vaciarCesta();
			}
		});
		
		int i = 0;
		for (PanelImagen pj : vans.getA()) {
			final int j = i;
			pj.getImagen().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					eliminarCentro();
					centro = new JPanel();

					desc = new PanelDescripcion(dVans.get(j));
					updateDescripcion(centro, desc);
				}
			});
			pj.getAniadir_cesta().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					// remove(norte);
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(num_articulos);
					mi_cesta.add(dVans.get(j));
					updateCesta(norte);
				}
			});
			
			pj.getComprar().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(
							num_articulos);
					mi_cesta.add(dVans.get(j));
					updateCesta(norte);
					
					remove(centro);
					centro = new JPanel();
					cesta = new PanelCesta(mi_cesta);
					updateMiCesta(centro, cesta);
					
				}
			});
			
			i++;
		}

		i = 0;
		for (PanelImagen pj : nb.getA()) {
			final int j = i;
			pj.getImagen().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					eliminarCentro();
					centro = new JPanel();

					desc = new PanelDescripcion(dNb.get(j));
					updateDescripcion(centro, desc);
				}
			});
			pj.getAniadir_cesta().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					// remove(norte);
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(num_articulos);
					mi_cesta.add(dNb.get(j));
					updateCesta(norte);
				}
			});
			
			pj.getComprar().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(
							num_articulos);
					mi_cesta.add(dNb.get(j));
					updateCesta(norte);
					
					eliminarCentro();
					centro = new JPanel();
					cesta = new PanelCesta(mi_cesta);
					updateMiCesta(centro, cesta);
					
				}
			});
			
			i++;
		}

		i = 0;
		for (PanelImagen pj : otras.getA()) {
			final int j = i;
			pj.getImagen().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					eliminarCentro();
					centro = new JPanel();

					desc = new PanelDescripcion(dOtras.get(j));
					updateDescripcion(centro, desc);
				}
			});
			pj.getAniadir_cesta().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					// remove(norte);
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(num_articulos);
					mi_cesta.add(dOtras.get(j));
					updateCesta(norte);
				}
			});
			
			pj.getComprar().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(
							num_articulos);
					mi_cesta.add(dOtras.get(j));
					updateCesta(norte);
					
					eliminarCentro();
					centro = new JPanel();
					cesta = new PanelCesta(mi_cesta);
					updateMiCesta(centro, cesta);
					
				}
			});
			
			i++;
		}

		i = 0;
		for (PanelImagen pj : asics.getA()) {
			final int j = i;
			pj.getImagen().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					eliminarCentro();
					centro = new JPanel();

					desc = new PanelDescripcion(dAsics.get(j));
					updateDescripcion(centro, desc);
				}
			});
			pj.getAniadir_cesta().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					// remove(norte);
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(num_articulos);
					mi_cesta.add(dAsics.get(j));
					updateCesta(norte);
				}
			});
			
			pj.getComprar().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(
							num_articulos);
					mi_cesta.add(dAsics.get(j));
					updateCesta(norte);
					
					remove(centro);
					centro = new JPanel();
					cesta = new PanelCesta(mi_cesta);
					updateMiCesta(centro, cesta);
					
				}
			});
			
			i++;
		}

		i = 0;
		for (PanelImagen pj : nike.getA()) {
			final int j = i;
			pj.getImagen().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					eliminarCentro();
					centro = new JPanel();

					desc = new PanelDescripcion(dNike.get(j));
					updateDescripcion(centro, desc);
				}
			});
			pj.getAniadir_cesta().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					// remove(norte);
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(num_articulos);
					mi_cesta.add(dNike.get(j));
					updateCesta(norte);
				}
			});
			
			
			final double t = dNike.get(j).getPrecio();
			pj.getComprar().addMouseListener(new MouseAdapter() {
				public void mousePressed(MouseEvent e) {
					norte.setLayout(null);
					num_articulos++;
					norte = new PanelNorte(
							num_articulos);
					mi_cesta.add(dNike.get(j));
					updateCesta(norte);
					
					eliminarCentro();
					centro = new JPanel();
					cesta = new PanelCesta(mi_cesta);
					updateMiCesta(centro, cesta);
					
					
				}
			});

			i++;
		}

		norte.getBc().getBusqueda().addKeyListener(new KeyAdapter() {
			public void keyPressed(KeyEvent arg0) {
				int key = arg0.getKeyCode();
				if (key == KeyEvent.VK_ENTER) {
					Toolkit.getDefaultToolkit().beep();
					String text = ((JTextField) arg0.getSource()).getText();
					ArrayList<Deportiva> deportivas = buscarZapatillas(text);

					if (deportivas == null || deportivas.size() == 0) {
						// No se han encontrado resultados
						JOptionPane.showMessageDialog(null,
								"No se encontraron resultados. :(");
					} else {
						eliminarCentro();
						centro = new JPanel();
						PanelMarca pm = new PanelMarca(deportivas);
						updateMarca(centro, pm);

						int i = 0;
						for (PanelImagen pj : pm.getA()) {
							final int j = i;
							pj.getImagen().addMouseListener(new MouseAdapter() {
								public void mousePressed(MouseEvent e) {
									remove(centro);
									centro = new JPanel();
									desc = new PanelDescripcion(buscadas.get(j));
									updateDescripcion(centro, desc);
								}
							});
							pj.getAniadir_cesta().addMouseListener(
									new MouseAdapter() {
										public void mousePressed(MouseEvent e) {
											norte.setLayout(null);
											num_articulos++;
											norte = new PanelNorte(
													num_articulos);
											mi_cesta.add(buscadas.get(j));
											updateCesta(norte);
										}
									});
							i++;
						}

					}

				}
			}
		});

	}

	/**
	 * Actualiza la pantalla con una marca determinada
	 * @param c JPanel a añadir las mascas
	 * @param a Panel con las Marcas a mostrar
	 */
	public void updateMarca(JPanel c, PanelMarca a) {
		JScrollPane scroller = new JScrollPane(a);
		scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		int num = a.getDeportivas().size();
		if (num == 1) {
			scroller.setPreferredSize(new Dimension(800, 90));
		} else if (num == 2) {
			scroller.setPreferredSize(new Dimension(800, 180));
		} else if (num == 3) {
			scroller.setPreferredSize(new Dimension(800, 270));
		} else {
			scroller.setPreferredSize(new Dimension(800, 380));
		}
		c.add(scroller, BorderLayout.CENTER);
		this.add(c);
		c.setVisible(true);
		this.revalidate();
	}

	/**
	 * Actualiza la pantalla con la descripción de una deportiva
	 * 
	 * @param c Panel a añadir la descripcion
	 * @param a Panel con la descripcion de una deportica
	 */
	public void updateDescripcion(JPanel c, PanelDescripcion a) {
		final Deportiva d = a.getDep();
		a.getComprar().addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				norte.setLayout(null);
				num_articulos++;
				norte = new PanelNorte(
						num_articulos);
				mi_cesta.add(d);
				updateCesta(norte);
				
				eliminarCentro();
				centro = new JPanel();
				cesta = new PanelCesta(mi_cesta);
				updateMiCesta(centro, cesta);

			}
		});
	
		// aniadimos los listeners correspondientes a los botones
		a.getAnCesta().addMouseListener(
				new MouseAdapter() {
					public void mousePressed(MouseEvent e) {
						norte.setLayout(null);
						num_articulos++;
						norte = new PanelNorte(
								num_articulos);
						mi_cesta.add(d);
						updateCesta(norte);
					}
				});
		JScrollPane scroller = new JScrollPane(a);
		scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		scroller.setPreferredSize(new Dimension(1000, 380));
		
		c.add(scroller, BorderLayout.CENTER);
		this.add(c);
		c.setVisible(true);
		this.revalidate();
	}

	/**
	 * Añade el panel de inicio a la pantalla principal
	 * @param c Panel a añadir el inicio
	 * @param a Panel de inicio
	 */
	public void updateInicio(JPanel c, PanelInicio a) {
		c.add(a, BorderLayout.CENTER);
		this.add(a);
		c.setVisible(true);
		this.revalidate();
	}

	/**
	 * Actualiza el numero de items de la cesta
	 * @param n Panel con el número de items de la cesta
	 */ 
	public void updateCesta(PanelNorte n) {
		this.add(n, BorderLayout.NORTH);
		n.setVisible(true);
		this.revalidate();
	}

	/**
	 * Actualiza la pantalla con los productos que hay en la cesta
	 * @param c Panel a añadir la cesta
	 * @param m Panel que gestiona la cesta y sus elementos
	 */
	public void updateMiCesta(JPanel c, PanelCesta m) {
		
		final double t = m.getTotal();
		m.getCompra().addMouseListener(new MouseAdapter() {
			
			public void mousePressed(MouseEvent e) {
				if(t==0.0){
					JOptionPane.showMessageDialog(null,
							"Error, no tienes nada en la cesta");
				}else{
					PanelCompra pc = new PanelCompra(t, MainWindow.this);
					frameComprar = new JFrame();
					frameComprar.setTitle("Realizar compra");
					frameComprar.add(pc);
					frameComprar.pack();
					frameComprar.setVisible(true);
					frameComprar.revalidate();
				}
			
			}
		});
		
		JScrollPane scroller = new JScrollPane(m);
		scroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		scroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		int num = m.getA().length;
		if (num == 1) {
			scroller.setPreferredSize(new Dimension(600, 160));
		} else if (num == 2) {
			scroller.setPreferredSize(new Dimension(600, 240));
		} else if (num == 3) {
			scroller.setPreferredSize(new Dimension(600, 320));
		} 
		else if(num == 0){
			scroller.setPreferredSize(new Dimension(600, 80));
		}
		else {
			scroller.setPreferredSize(new Dimension(600, 380));
		}
		c.add(scroller, BorderLayout.CENTER);
		this.add(c);
		c.setVisible(true);
		this.revalidate();

	}
	
	/**
	 * Busca deportivas que cumplan ciertas restricciones en su descripcion
	 * @param text Texto a buscar
	 * @return Array con las deportivas encontradas
	 */
	public ArrayList<Deportiva> buscarZapatillas(String text) {
		String[] palabras = text.split(" ");
		buscadas = new ArrayList<Deportiva>();
		try {
			for (Deportiva dep : deportivas) {
				for (String palabra : palabras) {
					if (palabra.toLowerCase().equals(
							dep.getMarca().toLowerCase())
							|| dep.getModelo().toLowerCase()
									.contains(palabra.toLowerCase())
							|| dep.getMarca().toLowerCase()
									.contains(palabra.toLowerCase())) {
						if (!buscadas.contains(dep)) {
							buscadas.add(dep);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return buscadas;

	}
	
	/**
	 * Vacia la cesta
	 */
	public void vaciarCesta(){
		norte.setLayout(null);
		num_articulos=0;
		norte = new PanelNorte(
				num_articulos);
		mi_cesta = new ArrayList<Deportiva>();
		updateCesta(norte);
	}
	
	/**
	 * Elimina el panel central
	 */
	public void eliminarCentro(){
		remove(centro);
		centro.setVisible(false);
		centro.setEnabled(false);
		centro.setLayout(null);
		
		remove(inicio);
		inicio.setVisible(false);
		inicio.setEnabled(false);
		inicio.setLayout(null);
	}
}
